/**
 * 数据相关API
 * @description 经济数据、财经日历等接口
 */

import { get, post } from '@/utils/modules/request'
import { formatApiData } from '@/utils/modules/data-formatter'

/**
 * 获取财经日历数据
 * @param {Object} data - 请求参数
 * @param {number} data.startTime - 开始时间戳（毫秒级）
 * @param {number} data.endTime - 结束时间戳（毫秒级）
 * @returns {Promise} 财经日历数据列表
 * @description 调用后端代理接口，返回的数据包含：
 *  - calendarName: 事件名称
 *  - countryCode: 国家代码（如"USA"）
 *  - countryName: 国家名称（如"美国"）
 *  - publishTimestamp: 发布时间戳（毫秒级）
 *  - importanceLevel: 重要性等级（1-3，3为最高）
 *  - hasExactPublishTime: 是否有精确发布时间（1=是，0=否）
 *  - dataEffect: 数据影响（如"利多加元"、"影响较小"）
 *  - forecastValue: 预期值
 *  - revisedPreviousValue: 修正后的前值
 *  - previousValue: 前值
 *  - publishedValue: 已发布值
 */
export const getEconomicData = async (data) => {
  const { start_time, end_time } = data || {}

  try {
    const response = await get('/cg/economic-data', {
      data: {
        startTime: start_time,
        endTime: end_time
      }
    })

    if (response && response.data) {
      const rawData = response.data || []
      // 统一格式化为驼峰格式
      const formattedData = formatApiData(rawData)
      return { data: formattedData }
    }
    throw new Error('请求失败')
  } catch (error) {
    console.error('获取财经日历数据失败:', error)
    throw error
  }
}

/**
 * 获取财经事件列表
 * @param {Object} data - 请求参数
 * @param {number} data.startTime - 开始时间戳（毫秒级）
 * @param {number} data.endTime - 结束时间戳（毫秒级）
 * @returns {Promise} 财经事件列表
 * @description 调用后端代理接口，返回的数据包含：
 *  - calendarName: 事件名称
 *  - countryCode: 国家代码（如"USA"）
 *  - countryName: 国家名称（如"美国"）
 *  - publishTimestamp: 发布时间戳（毫秒级）
 *  - importanceLevel: 重要性等级（1-3，3为最高）
 *  - hasExactPublishTime: 是否有精确发布时间（1=是，0=否）
 */
export const getFinancialEvents = async (data) => {
  const { start_time, end_time } = data || {}

  try {
    const response = await get('/cg/financial-events', {
      data: {
        startTime: start_time,
        endTime: end_time
      }
    })

    if (response && response.data) {
      const rawData = response.data || []
      // 统一格式化为驼峰格式
      const formattedData = formatApiData(rawData)
      return { data: formattedData }
    }
    throw new Error('请求失败')
  } catch (error) {
    console.error('获取财经事件失败:', error)
    throw error
  }
}

/**
 * 获取央行动态列表
 * @param {Object} data - 请求参数
 * @param {number} data.startTime - 开始时间戳（毫秒级）
 * @param {number} data.endTime - 结束时间戳（毫秒级）
 * @returns {Promise} 央行动态列表
 * @description 调用后端代理接口，返回的数据包含：
 *  - calendarName: 事件名称
 *  - countryCode: 国家代码（如"USA"）
 *  - countryName: 国家名称（如"美国"）
 *  - publishTimestamp: 发布时间戳（毫秒级）
 *  - importanceLevel: 重要性等级（1-3，3为最高）
 *  - hasExactPublishTime: 是否有精确发布时间（1=是，0=否）
 */
export const getCentralBankActivities = async (data) => {
  const { start_time, end_time } = data || {}

  try {
    const response = await get('/cg/central-bank-activities', {
      data: {
        startTime: start_time,
        endTime: end_time
      }
    })

    if (response && response.data) {
      const rawData = response.data || []
      // 统一格式化为驼峰格式
      const formattedData = formatApiData(rawData)
      return { data: formattedData }
    }
    throw new Error('请求失败')
  } catch (error) {
    console.error('获取央行动态失败:', error)
    throw error
  }
}

/**
 * 获取大额转账数据（鲸鱼警报）- 旧接口
 * @param {Object} data - 请求参数（可选）
 * @returns {Promise} 大额转账列表
 * @description 返回的数据包含：
 *  - amountUsd: 转账金额（单位：美元，字符串格式）
 *  - assetQuantity: 转账数量（资产的实际数量，如1.5 BTC，字符串格式）
 *  - assetSymbol: 资产符号（如BTC、ETH、USDT）
 *  - blockTimestamp: 区块时间戳（毫秒级）
 *  - logoUrl: 币种图标URL
 *  - timestamp: 时间戳（毫秒级）
 */
export const getWhaleAlert = (data) => post('/chain/getWhaleTransfer', data)

/**
 * 获取大额转账数据（分页）
 * @param {Object} data - 请求参数
 * @param {number} data.pageSize - 每页条数（可选，默认10）
 * @param {number} data.pageNo - 当前页码（可选，默认1）
 * @param {string} data.startTime - 开始时间（可选）
 * @param {string} data.endTime - 结束时间（可选）
 * @param {string} data.search - 搜索关键词（可选）
 * @returns {Promise} 大额转账分页列表
 * @description 返回的数据包含：
 *  - total: 总记录数 (integer <int64>)
 *  - pages: 总页数 (integer <int64>)
 *  - current: 当前页码 (integer <int64>)
 *  - size: 每页大小 (integer <int64>)
 *  - records: 转账列表 (array[object])
 *    - id: 记录ID (integer <int64>)
 *    - amountUsd: 转账金额，单位美元 (string)
 *    - assetQuantity: 转账数量，资产的实际数量，如1.5 BTC (string)
 *    - assetSymbol: 资产符号，如BTC、ETH、USDT (string)
 *    - from: 转账发送方地址，区块链钱包包地址 (string)
 *    - to: 转账接收方地址，区块链钱包包地址 (string)
 *    - blockchainName: 区块链名称，如Ethereum、Bitcoin、BSC (string)
 *    - blockTimestamp: 区块时间戳，建议根据实际返回格式选择Long或String，此处用Long便于时间处理 (integer <int64>)
 *    - logoUrl: 币种图标 (string)
 *    - timestamp: 时间戳 (integer <int64>)
 */
export const getWhaleTransferPage = (data) => get('/chain/getWhaleTransferPage', { data })

/**
 * 获取Hyperliquid持仓排行数据
 * @param {Object} data - 请求参数（可选）
 * @returns {Promise} 持仓排行列表
 * @description 返回的数据包含：
 *  - id: 序号
 *  - user: 用户地址（地址或用户标识）
 *  - symbol: 币种（如BTC-USDT, ETH-USDT）
 *  - logoUrl: 币种图标URL
 *  - positionSize: 仓位大小（正为做多，负为做空）
 *  - entryPrice: 入场价格
 *  - markPrice: 标记价格
 *  - liqPrice: 清算价格
 *  - leverage: 杠杆倍数（如10、20）
 *  - marginBalance: 保证金余额（单位：USD）
 *  - positionValueUsd: 仓位价值（单位：USD）
 *  - unrealizedPnl: 未实现盈亏（单位：USD）
 *  - fundingFee: 资金费率（单位：USD）
 *  - marginMode: 保证金模式（cross=全仓，isolated=逐仓）
 *  - createTime: 开仓时间（时间戳，单位：毫秒）
 *  - updateTime: 更新时间（时间戳，单位：毫秒）
 */
export const getWhalePosition = (data) => post('/chain/getWhalePosition', data)

/**
 * 获取 Web3 领域名人列表
 * @param {Object} data - 请求参数
 * @param {number} data.pageSize - 每页条数（可选，默认10）
 * @param {number} data.pageNo - 当前页码（可选，默认1）
 * @param {string} data.startTime - 开始时间（可选）
 * @param {string} data.endTime - 结束时间（可选）
 * @param {string} data.search - 查询条件（可选）
 * @returns {Promise} Web3 名人列表
 * @description 返回的数据包含：
 *  - id: 主键ID
 *  - celebrityName: 名人姓名/昵称（如"小唐纳德·特朗普"）
 *  - identityTag: 身份标签（如"Web3投资人""NFT收藏家""项目顾问"）
 *  - coreDescription: 核心描述（关联Web3领域的行为、项目、观点）
 *  - publicChainAddress: 公开链上地址（如ETH/BSC钱包地址，仅记录其主动公开的地址）
 *  - relatedProject: 关联Web3项目（如"参与某NFT系列投资""担任某DeFi项目顾问"）
 *  - socialMedia: Web3相关社交账号（如Twitter/X、Discord、Telegram的公开账号链接）
 *  - attentionNote: 注意事项（如"非官方认证地址，需警惕仿冒""关联项目存在市场风险"）
 */
export const getCelebrityList = (data) => get('/chain/getCelebrityList', { data })

/**
 * 根据ID获取名人详情
 * @param {Object} data - 请求参数
 * @param {number} data.id - 名人ID（必传）
 * @returns {Promise} 名人详情
 * @description 返回的数据包含：
 *  - id: 主键ID
 *  - celebrityName: 名人姓名/昵称
 *  - identityTag: 身份标签
 *  - coreDescription: 核心描述
 *  - publicChainAddress: 公开链上地址
 *  - relatedProject: 关联Web3项目
 *  - socialMedia: Web3相关社交账号
 *  - attentionNote: 注意事项
 */
export const getCelebrityDetail = (data) => get('/chain/getCelebrityDetail', { data })

/**
 * 获取充值与提现记录
 * @param {Object} data - 请求参数
 * @param {string} data.address - 用户地址（必传）
 * @returns {Promise} 充值提现记录列表
 * @description 返回的数据包含：
 *  - time: 操作时间（字符串格式）
 *  - type: 操作类型（如"充值"、"提现"）
 *  - usdc: 操作价值（单位：USDC，字符串格式）
 */
export const getRechargeWithdraw = (data) => post('/chain/getRechargeWithdraw', data)

/**
 * 获取交易记录
 * @param {Object} data - 请求参数
 * @param {string} data.address - 用户地址（必传）
 * @returns {Promise} 交易记录列表
 * @description 返回的数据包含：
 *  - dir: 操作方向（"buy"=买入，"sell"=卖出）
 *  - coin: 交易代币（如"BTC"、"ETH"）
 *  - time: 成交时间（字符串格式）
 *  - sz: 成交数量（字符串格式）
 *  - px: 成交价格（字符串格式）
 *  - logoUrl: 币种图标URL
 *  - timestamp: 时间戳（毫秒级）
 */
export const getTrade = (data) => post('/chain/getTrade', data)

/**
 * 获取持仓记录
 * @param {Object} data - 请求参数
 * @param {string} data.address - 用户地址（必传）
 * @returns {Promise} 持仓记录列表
 * @description 返回的数据包含：
 *  - coin: 仓位代币（如"BTC"、"ETH"）
 *  - typeValue: 杠杆倍数（如"10"、"20"）
 *  - szi: 仓位数量（字符串格式）
 *  - side: 仓位方向（"long"=做多，"short"=做空）
 *  - positionValue: 仓位价值（单位：USD）
 *  - entryPx: 开仓价格
 *  - unrealizedPnl: 未实现盈亏（单位：USD）
 *  - sinceOpen: 资金费
 *  - liquidationPx: 爆仓价格
 *  - logoUrl: 币种图标URL
 */
export const getPosition = (data) => post('/chain/getPosition', data)

/**
 * 获取委托记录
 * @param {Object} data - 请求参数
 * @param {string} data.address - 用户地址（必传）
 * @returns {Promise} 委托记录列表
 * @description 返回的数据包含：
 *  - coin: 委托代币（如"BTC"、"ETH"）
 *  - time: 委托时间（字符串格式）
 *  - orderType: 委托类型（"limit"=限价单，"market"=市价单）
 *  - origSz: 委托数量
 *  - limitPx: 委托价格（仅限价单有效）
 *  - triggerPx: 触发价格
 *  - logoUrl: 币种图标URL
 *  - timestamp: 时间戳（毫秒级）
 */
export const getOrder = (data) => post('/chain/getOrder', data)

/**
 * 获取新闻快讯列表（分页）
 * @param {Object} data - 请求参数
 * @param {number} data.pageSize - 每页条数（可选，默认10）
 * @param {number} data.pageNo - 当前页码（可选，默认1）
 * @param {string} data.startTime - 开始时间（可选，格式：yyyy-MM-dd HH:mm:ss）
 * @param {string} data.endTime - 结束时间（可选，格式：yyyy-MM-dd HH:mm:ss）
 * @param {string} data.search - 搜索关键词（可选）
 * @returns {Promise} 新闻快讯列表
 * @description 返回的数据包含：
 *  - total: 总记录数
 *  - pages: 总页数
 *  - current: 当前页码
 *  - size: 每页大小
 *  - records: 新闻列表
 *    - id: 新闻ID
 *    - time: 发布时间（格式：yyyy-MM-dd HH:mm:ss）
 *    - title: 新闻标题
 *    - content: 新闻内容
 *    - timestamp: 时间戳
 */
export const getNewsPage = (data) => get('/chain/getNewsPage', { data })
